package com.bbva.kyfb.kyfbbofc.helpers;

import org.junit.After;
import org.junit.Before;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.ClassPathResource;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.bbva.kyfb.kyfbbofc.utils.KyfbUtils;


	/**
	 * The Class AbstractPreloadDB.
	 *
	 * @author xe22570
	 */

	@RunWith(SpringJUnit4ClassRunner.class)
	@ContextConfiguration(locations = { "classpath:/META-INF/spring/applicationContext.xml" })
	public abstract class AbstractPreloadDB {
		
		/** jdbc template. */
		@Autowired
		private JdbcTemplate jdbcTlbh;
		
		/** The jdbc tlsb. */
		@Autowired
		private JdbcTemplate jdbcTlsb;

		/**
		 * Gets the jdbc template tlbh.
		 *
		 * @return the jdbcTemplate
		 */
		public JdbcTemplate getJdbcTemplateTlbh() {
			return jdbcTlbh;
		}
		
		/**
		 * Gets the jdbc template tlsb.
		 *
		 * @return the jdbcTemplate
		 */
		public JdbcTemplate getJdbcTemplateTlsb() {
			return jdbcTlsb;
		}

		/**
		 * Sets the jdbc template tlbh.
		 *
		 * @param jdbcTemplate the jdbcTemplate to set
		 */
		public void setJdbcTemplateTlbh(JdbcTemplate jdbcTemplate) {
			this.jdbcTlbh = jdbcTemplate;
		}
		
		/**
		 * Sets the jdbc template tlsb.
		 *
		 * @param jdbcTemplate the jdbcTemplate to set
		 */
		public void setJdbcTemplateTlsb(JdbcTemplate jdbcTemplate) {
			this.jdbcTlsb = jdbcTemplate;
		}


		/**
		 * Inits the db data.
		 *
		 * @throws Exception the exception
		 */
		@Before
		public void initDbData() throws Exception {
			initTlsbData();
			initTlbhData();
			setUpTest();
		}

		/**
		 * funcion a implementar por los metodos hijos tras la inicializacion de los
		 * datos.
		 *
		 * @throws Exception the exception
		 */
		public abstract void setUpTest() throws Exception;

		/**
		 * funcion a implementar por los metodos hijos tras el borrado de los datos.
		 *
		 * @throws Exception the exception
		 */
		public abstract void tearDownTest() throws Exception;

		/**
		 * Finish db data.
		 *
		 * @throws Exception the exception
		 */
		@After
		public void finishDbData() throws Exception {
			// no lanzamos deleteAllData puesto que al comienzo de cada test se
			// lanza
			// la carga de datos que ya tiene (el script) el borrado al comienzo
			tearDownTest();
		}

		/**
		 * carga el script de datos de TLBH.
		 *
		 * @throws Exception the exception
		 */
		public final void initTlbhData() throws Exception {
			deleteTlhbData();
			KyfbUtils.runSqlFromScriptResource(new ClassPathResource("META-INF/h2/populateBBDD_TLBH.sql"), jdbcTlbh);
		}
		
		/**
		 * carga el script de datos de configuracion de TLSB.
		 *
		 * @throws Exception the exception
		 */
		public final void initTlsbData() throws Exception {
			deleteTlsbData();
			KyfbUtils.runSqlFromScriptResource(new ClassPathResource("META-INF/h2/populateBBDD_TLSB.sql"), jdbcTlsb);
		}
		

		/**
		 * carga el script de borrado de datos de TLSB.
		 *
		 * @throws Exception the exception
		 */
		public final void deleteTlsbData() throws Exception {
			KyfbUtils.runSqlFromScriptResource(new ClassPathResource("META-INF/h2/deleteBBDD_TLSB.sql"), jdbcTlsb);
		}
		
		/**
		 * carga el script de borrado de datos de TLBH.
		 *
		 * @throws Exception the exception
		 */
		public final void deleteTlhbData() throws Exception {
			KyfbUtils.runSqlFromScriptResource(new ClassPathResource("META-INF/h2/deleteBBDD_TLBH.sql"), jdbcTlbh);
		}
	
}
